package org.md.budzik.problems;

import java.math.BigInteger;

/**
 * Obsługa tzw. nieporządków.
 * @author Wiezzel
 *
 */
public class Disorder extends OneArgOp {

	public Disorder(Expression ex) {
		super(ex);
	}

	protected BigInteger computeOperation(BigInteger value) throws ParseException {
		if (value.compareTo(BigInteger.ZERO) < 0)
			throw new ParseException("Nieporządki są zdefiniowane dla wartości >= 0");
		if (value.equals(BigInteger.ZERO))
			return BigInteger.ONE;
		else if (value.equals(BigInteger.ONE))
			return BigInteger.ZERO;
		else {
			BigInteger d1 = BigInteger.ONE;
			BigInteger d2 = BigInteger.ZERO;
			for (BigInteger i = BigInteger.ONE; i.compareTo(value) < 0; i = i.add(BigInteger.ONE)) {
				BigInteger d3 = d2;
				d2 = i.multiply(d2.add(d1));
				d1 = d3;
			}
			return d2;
		}
	}

	protected String operationSymbol() {
		return "disor";
	}

}
